Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_rrc_protocol.py

Displaying Raw • Download


tests/backend/test_rrc_protocol.py e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 11.29 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Unit tests for the RRC protocol and manager layers."""

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrc Tff7b72import Te6edf3protocol Tff7b72as Te6edf3proto
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787manager Tff7b72import Te6edf3RRCHubTb4b4b4, Te6edf3RRCManager


Tff7b72class T56d364FakeIdentityTb4b4b4:
T8b949e"""Minimal stand-in for an RNS identity."""

Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3hash_bytesTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Tffea00\x03Tffea00\x04Tffea00\x05Tffea00\x06Tffea00\x07Tffea00\x08Tffea00\x09Tffea00\x0aTffea00\x0bTffea00\x0cTffea00\x0dTffea00\x0eTffea00\x0fTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3hash_bytes


Tff7b72def Td2a8ffmake_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3nicknameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RRCManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3FakeIdentityTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Te6edf3get_nicknameTff7b72=Tb4b4b4(Tff7b72lambdaTb4b4b4: Te6edf3nicknameTb4b4b4)Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_envelope_roundtripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4,
Te6edf3srcTff7b72=Ta5d6ffbTa5d6ff"Ta5d6ffabcdTa5d6ff"Tb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6ffLobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4,
Te6edf3midTff7b72=Ta5d6ffbTa5d6ff"Ta5d6ff12345678Ta5d6ff"Tb4b4b4,
Te6edf3tsTff7b72=T79c0ff42Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_MSG
Tff7b72assert Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_ROOMTb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffLobbyTa5d6ff"
Te6edf3decoded Tff7b72= Te6edf3protoTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3decoded Tff7b72== Te6edf3env


Tff7b72def Td2a8fftest_normalize_roomTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Ta5d6ff"Ta5d6ff LoBBy Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fflobbyTa5d6ff"


Tff7b72def Td2a8fftest_normalize_room_empty_raisesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787pytest

Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_mentionsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3protoTff7b72.Td2a8fftext_mentionsTb4b4b4(Ta5d6ff"Ta5d6ffhey @Alice, hiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3protoTff7b72.Td2a8fftext_mentionsTb4b4b4(Ta5d6ff"Ta5d6ffhey aliceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3protoTff7b72.Td2a8fftext_mentionsTb4b4b4(Ta5d6ff"Ta5d6ffhey @alicebobTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3protoTff7b72.Td2a8fftext_mentionsTb4b4b4(Ta5d6ff"Ta5d6ffanythingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_parse_who_noticeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3protoTff7b72.Td2a8ffparse_who_noticeTb4b4b4(
Ta5d6ff"Ta5d6ffmembers in lobby: alice (aabbccddeeff), aabbccddeeff00112233445566778899Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3parsed Tff7b72is Tff7b72not Tff7b72None
Te6edf3roomTb4b4b4, Te6edf3entries Tff7b72= Te6edf3parsed
Tff7b72assert Te6edf3room Tff7b72== Ta5d6ff"Ta5d6fflobbyTa5d6ff"
Tff7b72assert Tb4b4b4(Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaabbccddeeffTa5d6ff"Tb4b4b4) Tff7b72in Te6edf3entries
Tff7b72assert Tb4b4b4(Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffaabbccddeeff00112233445566778899Ta5d6ff"Tb4b4b4) Tff7b72in Te6edf3entries


Tff7b72def Td2a8fftest_parse_who_notice_rejects_other_textTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3protoTff7b72.Td2a8ffparse_who_noticeTb4b4b4(Ta5d6ff"Ta5d6ffhello worldTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72def Td2a8fftest_parse_room_list_noticeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3protoTff7b72.Td2a8ffparse_room_list_noticeTb4b4b4(
Ta5d6ff"Ta5d6ffRegistered public roomsTffea00\nTa5d6fflobby - The lobbyTffea00\nTa5d6ffrandomTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3parsed Tff7b72== Tb4b4b4{Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffThe lobbyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrandomTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4}
Tff7b72assert Te6edf3protoTff7b72.Td2a8ffparse_room_list_noticeTb4b4b4(Ta5d6ff"Ta5d6ffNo public rooms registeredTa5d6ff"Tb4b4b4) Tff7b72== Tb4b4b4{Tb4b4b4}
Tff7b72assert Te6edf3protoTff7b72.Td2a8ffparse_room_list_noticeTb4b4b4(Ta5d6ff"Ta5d6ffunrelatedTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72def Td2a8fftest_message_to_dictTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3msg Tff7b72= Te6edf3protoTff7b72.Td2a8ffRRCMessageTb4b4b4(Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\xaaTffea00\xbbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4, T79c0ff123Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffmention Tff7b72= Tff7b72True
Te6edf3msgTff7b72.Td2a8ffseq Tff7b72= T79c0ff7
Tff7b72assert Te6edf3msgTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4) Tff7b72== Tb4b4b4{
Ta5d6ff"Ta5d6ffkindTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsrcTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaabbTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4: T79c0ff123Tb4b4b4,
Ta5d6ff"Ta5d6ffmentionTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffseqTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8fftest_manager_add_and_find_hubTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub_hash Tff7b72= Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Te6edf3hub_hashTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffTest HubTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_hashTb4b4b4) Tff7b72is Te6edf3hub
Tff7b72assert Te6edf3managerTff7b72.Td2a8fffind_hub_by_hexTb4b4b4(Te6edf3hub_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72is Te6edf3hub
Tff7b72assert Te6edf3managerTff7b72.Td2a8fffind_hub_by_hexTb4b4b4(Ta5d6ff"Ta5d6ffnot-hexTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None

T8b949e# adding the same hub again returns the existing instance
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Te6edf3hub_hashTb4b4b4) Tff7b72is Te6edf3hub

Te6edf3payload Tff7b72= Te6edf3managerTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== T79c0ff1
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest HubTa5d6ff"
Tff7b72assert Te6edf3payloadTb4b4b4[Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhub_hashTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3hub_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_manager_save_and_load_roundtripTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub_hash Tff7b72= Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Te6edf3hub_hashTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffPersistedTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffadd_roomTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffset_auto_reconnectTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3hubTff7b72.Td2a8ffset_nick_overrideTb4b4b4(Ta5d6ff"Ta5d6ffnicknameTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffset_hub_iconTb4b4b4(Ta5d6ff"Ta5d6ffsatellite-uplinkTa5d6ff"Tb4b4b4)

Te6edf3reloaded Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3reloadedTff7b72.Td2a8ffhubsTb4b4b4) Tff7b72== T79c0ff1
Te6edf3loaded Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffhubsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffhub_hash Tff7b72== Te6edf3hub_hash
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72in Te6edf3loadedTff7b72.Td2a8ffrooms
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffauto_reconnect Tff7b72is Tff7b72True
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffnick_override Tff7b72== Ta5d6ff"Ta5d6ffnicknameTa5d6ff"
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffget_hub_iconTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffsatellite-uplinkTa5d6ff"


Tff7b72def Td2a8fftest_hub_room_order_persistedTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffadd_roomTb4b4b4(Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffadd_roomTb4b4b4(Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffreorder_roomsTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)

Te6edf3reloaded Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Te6edf3loaded Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffhubsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffordered_known_roomsTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4] Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4]


Tff7b72def Td2a8fftest_hub_icon_rejects_invalid_nameTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffset_hub_iconTb4b4b4(Ta5d6ff"Ta5d6ffNot Valid!Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_connect_auto_reconnect_hubs_after_loadTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub_hash Tff7b72= Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Te6edf3hub_hashTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffPersistedTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffset_auto_reconnectTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3managerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)

Te6edf3reloaded Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Te6edf3loaded Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffhubsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3calls Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8fffake_connectTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3loadedTb4b4b4)

Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3loadedTb4b4b4, Ta5d6ff"Ta5d6ffconnectTa5d6ff"Tb4b4b4, Te6edf3fake_connectTb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffconnect_auto_reconnect_hubsTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Te6edf3loadedTb4b4b4]

Te6edf3hubTff7b72.Td2a8ffset_auto_reconnectTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3managerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Te6edf3reloaded2 Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3reloaded2Tff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Te6edf3callsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3reloaded2Tff7b72.Td2a8ffhubsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffconnectTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3reloaded2Tff7b72.Td2a8ffconnect_auto_reconnect_hubsTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Tb4b4b4]


Tff7b72def Td2a8fftest_hub_records_incoming_message_and_unreadTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4,
Te6edf3srcTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x10Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffhello thereTa5d6ff"Tb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffcarolTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)Tb4b4b4)

Te6edf3messages Tff7b72= Te6edf3hubTff7b72.Td2a8ffget_messagesTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3messagesTb4b4b4) Tff7b72== T79c0ff1
Tff7b72assert Te6edf3messagesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffhello thereTa5d6ff"
Tff7b72assert Te6edf3messagesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffnick Tff7b72== Ta5d6ff"Ta5d6ffcarolTa5d6ff"
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72in Te6edf3hubTff7b72.Td2a8ffunread_rooms


Tff7b72def Td2a8fftest_hub_detects_mentionTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3nicknameTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4,
Te6edf3srcTff7b72=Ta5d6ffbTa5d6ff"Tffea00\x20Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffhey @alice lookTa5d6ff"Tb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffcarolTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)Tb4b4b4)

Te6edf3messages Tff7b72= Te6edf3hubTff7b72.Td2a8ffget_messagesTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3messagesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffmention Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72in Te6edf3hubTff7b72.Td2a8ffmention_rooms


Tff7b72def Td2a8fftest_hub_ignores_own_echoed_messageTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3mid Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffdeadbeefTa5d6ff"
Te6edf3hubTff7b72.Td2a8ff_sent_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3midTb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4,
Te6edf3srcTff7b72=Te6edf3managerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffechoTa5d6ff"Tb4b4b4,
Te6edf3midTff7b72=Te6edf3midTb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3hubTff7b72.Td2a8ffget_messagesTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4) Tff7b72== Tb4b4b4[Tb4b4b4]


Tff7b72def Td2a8fftest_hub_notice_updates_room_listTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4,
Te6edf3srcTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffRegistered public roomsTffea00\nTa5d6fflobby - MainTffea00\nTa5d6ffrandomTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3hubTff7b72.Td2a8ffavailable_rooms Tff7b72== Tb4b4b4{Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMainTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrandomTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4}


Tff7b72def Td2a8fftest_welcome_sends_list_when_auto_list_enabledTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffauto_list Tff7b72= Tff7b72True
Te6edf3calls Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffsend_command Tff7b72= Tff7b72lambda Te6edf3textTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4, Te6edf3record_localTff7b72=Tff7b72TrueTb4b4b4: Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3textTb4b4b4)

Te6edf3hubTff7b72.Td2a8ff_handle_welcomeTb4b4b4(Tb4b4b4{Tb4b4b4}Tb4b4b4)

Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4]


Tff7b72def Td2a8fftest_silent_self_join_records_rejoined_system_lineTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_silent_joinsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3managerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4]Tb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffmeTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3hubTff7b72.Td2a8ff_handle_joinedTb4b4b4(Te6edf3envTb4b4b4)

Te6edf3msgs Tff7b72= Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff" Tff7b72and Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffYou rejoined #lobbyTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3msgsTb4b4b4)


Tff7b72def Td2a8fftest_manual_self_join_records_joined_system_lineTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_pending_joinsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3managerTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4]Tb4b4b4,
Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffmeTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3hubTff7b72.Td2a8ff_handle_joinedTb4b4b4(Te6edf3envTb4b4b4)

Te6edf3msgs Tff7b72= Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff" Tff7b72and Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffYou joined #lobbyTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3msgsTb4b4b4)


Tff7b72def Td2a8fftest_connection_lost_records_system_line_in_joined_roomsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffmessagesTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffauto_reconnect Tff7b72= Tff7b72False

Te6edf3hubTff7b72.Td2a8ff_on_closedTb4b4b4(Tffa657objectTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3msgs Tff7b72= Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff" Tff7b72and Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffConnection lostTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3msgsTb4b4b4)


Tff7b72def Td2a8fftest_manual_disconnect_records_disconnected_system_lineTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffmessagesTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ff_manual_disconnect Tff7b72= Tff7b72True
Te6edf3hubTff7b72.Td2a8ffauto_reconnect Tff7b72= Tff7b72False

Te6edf3hubTff7b72.Td2a8ff_on_closedTb4b4b4(Tffa657objectTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3msgs Tff7b72= Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff" Tff7b72and Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffDisconnected from hubTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3msgsTb4b4b4)


Tff7b72def Td2a8fftest_welcome_after_session_records_reconnectedTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffmessagesTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ff_had_session Tff7b72= Tff7b72True
Te6edf3hubTff7b72.Td2a8ffauto_list Tff7b72= Tff7b72False
Te6edf3hubTff7b72.Td2a8ffauto_who Tff7b72= Tff7b72False

Te6edf3hubTff7b72.Td2a8ff_handle_welcomeTb4b4b4(Tb4b4b4{Tb4b4b4}Tb4b4b4)

Te6edf3msgs Tff7b72= Te6edf3hubTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8ffkind Tff7b72== Ta5d6ff"Ta5d6ffsystemTa5d6ff" Tff7b72and Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffReconnected to hubTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3msgsTb4b4b4)


Tff7b72def Td2a8fftest_set_auto_list_requests_list_immediately_when_already_connectedTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Enabling auto-list mid-session must not require a reconnect to take effect."""
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3calls Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffsend_command Tff7b72= Tff7b72lambda Te6edf3textTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4, Te6edf3record_localTff7b72=Tff7b72TrueTb4b4b4: Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3textTb4b4b4)

Te6edf3hubTff7b72.Td2a8ffset_auto_listTb4b4b4(Tff7b72TrueTb4b4b4)

Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4]


Tff7b72def Td2a8fftest_set_auto_list_does_not_list_before_hub_is_connectedTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3calls Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffsend_command Tff7b72= Tff7b72lambda Te6edf3textTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4, Te6edf3record_localTff7b72=Tff7b72TrueTb4b4b4: Te6edf3callsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3textTb4b4b4)

Te6edf3hubTff7b72.Td2a8ffset_auto_listTb4b4b4(Tff7b72TrueTb4b4b4)

Tff7b72assert Te6edf3calls Tff7b72== Tb4b4b4[Tb4b4b4]


Tff7b72def Td2a8fftest_history_is_persisted_and_reloadedTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffadd_roomTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3protoTff7b72.Td2a8ffRRCMessageTb4b4b4(Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x30Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffdaveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpersisted textTa5d6ff"Tb4b4b4, T79c0ff100Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ff_record_messageTb4b4b4(Te6edf3msgTb4b4b4)

Te6edf3reloaded Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Te6edf3loaded_hub Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffhubsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3messages Tff7b72= Te6edf3loaded_hubTff7b72.Td2a8ffget_messagesTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTff7b72.Td2a8fftext Tff7b72== Ta5d6ff"Ta5d6ffpersisted textTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3messagesTb4b4b4)


Tff7b72def Td2a8fftest_status_serializationTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3make_managerTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3hubTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RRCHubTff7b72.Td2a8ffSTATUS_DISCONNECTED
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffconnectedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4[Tb4b4b4]


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────